package org.csu.mypetstore.controller;


import org.csu.mypetstore.domain.Account;
import org.csu.mypetstore.domain.Cart;
import org.csu.mypetstore.domain.CartItem;
import org.csu.mypetstore.domain.Item;
import org.csu.mypetstore.service.CartService;
import org.csu.mypetstore.service.CatalogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import javax.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;

@Controller
@RequestMapping("/cart")
@SessionAttributes(value={"loginAccount","cart"})
public class CartController {

    @Autowired
    private CartService cartService;

    @Autowired
    private CatalogService catalogService;

    @GetMapping("/viewCart")
    public String viewCart(Model model){

        Account loginAccount = (Account) model.getAttribute("loginAccount");
        System.out.println(loginAccount);

        if(loginAccount == null){
            return "/cart/Cart";
        }else{

            Cart cart = cartService.getCartByUsername(loginAccount.getUsername());
            loginAccount.setCart(cart);
            model.addAttribute("loginAccount",loginAccount);
            model.addAttribute("cart",cart);
            return "/cart/Cart";
        }
    }

    @GetMapping("/addItemToCart")
    public String addItemToCart(String workingItemId,Model model){

        Account loginAccount = (Account) model.getAttribute("loginAccount");

        Cart cart = cartService.getCartByUsername(loginAccount.getUsername());
        Item item = catalogService.getItem(workingItemId);
        item.setSupplierId(item.getSupplierId()-1);
        catalogService.updateItem(item);

        CartItem cartItem = null;

        if(cart == null){

            cart = new Cart();
            cartItem = new CartItem();

            cartItem.setItem(item);
            cartItem.setInStock(1);
            cartItem.setUsername(loginAccount.getUsername());
            cartItem.setQuantity(1);
            cartItem.setTotal(item.getListPrice());

            ArrayList<CartItem> list = new ArrayList();
            list.add(cartItem);

            cart.setUsername(loginAccount.getUsername());
            cart.setPrice(item.getListPrice());
            cart.setList(list);
            loginAccount.setCart(cart);

            model.addAttribute("loginAccount",loginAccount);
            model.addAttribute("cart",cart);

            cartService.createCart(loginAccount.getUsername(),item.getListPrice());
            cartService.createCartItem(cartItem);

        }else{
            boolean is = false;
            int count = 0;
            BigDecimal listPrice = new BigDecimal(0);
            for(int i = 0;i < cart.getCartItemList().size();i++){
                if(cart.getCartItemList().get(i).getItem().getItemId().equals(workingItemId)){

                    count = cart.getCartItemList().get(i).getQuantity() + 1;
                    cart.getCartItemList().get(i).setQuantity(count);
                    cart.getCartItemList().get(i).setTotal(cart.getCartItemList().get(i).getItem().getListPrice().multiply(new BigDecimal(count)));

                    cartItem = cart.getCartItemList().get(i);
                    cart.setPrice(cart.getSubTotal());
                    loginAccount.setCart(cart);

                    is = true;
                    break;
                }
            }

            if(is){
                cartService.updateCartItem(cartItem);
                cartService.updateCart(cart.getSubTotal(),loginAccount.getUsername());

                model.addAttribute("loginAccount",loginAccount);
                model.addAttribute("cart",cart);
            }else{
                cartItem = new CartItem();

                cartItem.setItem(item);
                cartItem.setTotal(item.getListPrice());
                cartItem.setQuantity(1);
                cartItem.setUsername(loginAccount.getUsername());
                cartItem.setInStock(1);

                cartService.createCartItem(cartItem);

                cart.getCartItemList().add(cartItem);
                cart.setPrice(cart.getSubTotal().add(cartItem.getTotal()));
                loginAccount.setCart(cart);

                model.addAttribute("loginAccount",loginAccount);
                model.addAttribute("cart",cart);

                cartService.updateCart(cart.getSubTotal(),loginAccount.getUsername());

            }
        }
        return "/cart/Cart";
    }

    @GetMapping("/removeItemFromCart")
    public String removeItemFromCart(String workingItemId,HttpSession session,Model model){

        Account loginAccount = (Account) session.getAttribute("loginAccount");

        Cart cart = loginAccount.getCart();

        if(cart == null){
            model.addAttribute("msg","购物车已经清空!");
            return "ErrorH";
        }

        int count = 0;
        int number = cart.getCartItemList().size();
        CartItem cartItem = null;

        for (int i = 0; i < number; i++) {

            if (cart.getCartItemList().get(i).getItem().getItemId().equals(workingItemId)) {

                cartItem = cart.getCartItemList().get(i);
                break;
            }

            count++;
        }

        if(count == number){
            model.addAttribute("msg","该商品已经被移除!");
            return "ErrorH";
        }

        cart.getCartItemList().remove(cartItem);
        cart.setPrice(cart.getSubTotal());
        loginAccount.setCart(cart);

        cartService.removeCartItem(workingItemId, loginAccount.getUsername());
        cartService.updateCart(cart.getSubTotal(), loginAccount.getUsername());

        if (cart.getCartItemList().size() == 0) {
            loginAccount.setCart(null);
            cartService.removeCart(loginAccount.getUsername());
        }

        model.addAttribute("loginAccount",loginAccount);
        model.addAttribute("cart",cart);

        return "/cart/Cart";
    }

    @GetMapping("/updateCart")
    @ResponseBody
    public String updateCart(String itemId,int quantity,Model model,HttpSession session){
        Account loginAccount = (Account) session.getAttribute("loginAccount");

        Cart cart = loginAccount.getCart();
        Iterator<CartItem> cartItems = cart.getAllCartItems();
        Item item = catalogService.getItem(itemId);

        CartItem cartItem = new CartItem();
        cartItem.setItem(item);
        cartItem.setUsername(loginAccount.getUsername());
        cartItem.setQuantity(quantity);
        cartItem.setTotal(item.getListPrice().multiply(new BigDecimal(quantity)));
        cartItem.setInStock(1);

        cartService.updateCartItem(cartItem);
        BigDecimal bigDecimalList = new BigDecimal(0);

        while(cartItems.hasNext()){
            cartItem = cartItems.next();
            item = cartItem.getItem();
            String itemIdA = item.getItemId();

            if(itemIdA.equals(itemId)){
                cartItem.setQuantity(quantity);
                bigDecimalList = item.getListPrice().multiply(new BigDecimal(quantity));
                cartItem.setTotal(bigDecimalList);
                cart.setPrice(cart.getSubTotal());
                break;
            }
        }

        cartService.updateCart(cart.getPrice(),loginAccount.getUsername());

        model.addAttribute("loginAccount",loginAccount);
        model.addAttribute("cart",cart);

        return bigDecimalList + "," + cart.getPrice() + "," + itemId;
    }
}
